#include <stdio.h>
#include <omp.h>

// 模拟工作函数，输出当前线程和循环变量信息
void work(int i, int j) {
    int tid = omp_get_thread_num();
    printf("  Inner loop: Thread %d executes work(%d, %d)\n", tid, i, j);
}

void good_nesting(int n) {
    int i, j;
    // 外层并行区域
    #pragma omp parallel default(shared)
    {
        // 外层循环分发
        #pragma omp for
        for (i = 0; i < n; i++) {
            int outer_tid = omp_get_thread_num();
            printf("Outer loop: Thread %d processing i = %d\n", outer_tid, i);
            // 内层并行区域，每次外层循环迭代时启动新的一组线程
            #pragma omp parallel shared(i, n)
            {
                #pragma omp for
                for (j = 0; j < n; j++) {
                    work(i, j);
                }
            }
        }
    }
}

int main() {
    // 启用嵌套并行
    omp_set_nested(1);

    int n = 4;  // 定义循环次数
    good_nesting(n);

    // 防止程序运行后窗口立即关闭
    printf("Press Enter to exit...\n");
    getchar();
    return 0;
}
